package com.java.test.file;

import java.io.File;
import java.io.IOException;
import java.nio.file.*;
import java.nio.file.attribute.BasicFileAttributes;

/**
 * 如何用Java代码列出一个目录下所有的文件？
 */
public class ListFile {

    public static void showDirectory1(String dir) {
        File f = new File(dir);
        for(File temp : f.listFiles()) {
            if(temp.isFile()) {
                System.out.println(temp.getName());
            }
        }
    }

    // 如果需要对文件夹继续展开，代码如下所示：
    public static void showDirectory2(String dir) {
        File f = new File(dir);
        _walkDirectory(f, 0);
    }

    private static void _walkDirectory(File f, int level) {
        if(f.isDirectory()) {
            for(File temp : f.listFiles()) {
                _walkDirectory(temp, level + 1);
            }
        }
        else {
            for(int i = 0; i < level - 1; i++) {
                System.out.print("\t");
            }
            System.out.println(f.getName());
        }
    }

    // 在Java 7中可以使用NIO.2的API来做同样的事情，代码如下所示：
    public static void showDirectory3(String dir) throws IOException {
        Path initPath = Paths.get(dir);
        Files.walkFileTree(initPath, new SimpleFileVisitor<Path>() {
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs)
                    throws IOException {
                System.out.println(file.getFileName().toString());
                return FileVisitResult.CONTINUE;
            }

        });
    }
    public static void main(String[] args) throws IOException {
        String dir = "D:\\tmp";
//        showDirectory1(dir);
//        showDirectory2(dir);
        showDirectory3(dir);
    }
}
